/*
 * Alloy Analyzer
 * Copyright (c) 2002 Massachusetts Institute of Technology
 *
 * The Alloy Analyzer is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * The Alloy Analyzer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with the Alloy Analyzer; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package alloy.util;


/**
 * An object for saving information on where/when another object was created; in particular,
 * for saving the current stack trace.  Useful when some object in your program
 * is showing strange results == by creating and saving an instance of {@link StackTrace}
 * in the object at construction time, you can find out where the erroneous object comes from.
 * <p>
 * Because the saving of many stack dumps can be a memory hog, this class also provides a central
 * point for disabling the saving of stack traces.
 *
 * @see Util#getStackTrace
 */
public class CreationInfo {
    /** The exception in which the stack trace is saved at creation */
    private final Throwable _snapshot = new Throwable();

    /**
     * Given an object, if it implements {@link HasCreationInfo} and actually has saved
     * creation info, then return the string describing the creation info, else
     * return the empty string.
     */
    public static String info(Object obj_) {
	if (obj_ == null || !(obj_ instanceof HasCreationInfo)) return "";
	CreationInfo cinfo = ((HasCreationInfo)obj_).getCreationInfo();
	return " created: " + cinfo.toString() + " ";
    }

    public String toString() { return Util.getStackTrace(_snapshot).toString(); }
}
